﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;

namespace 事物
{
    class DbHelperSQL
    {


        public static string connectionString = ConfigurationManager.AppSettings["ConnectionString"];

        /// <summary>
        /// 执行多条SQL语句，实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">SQL语句的哈希表（key为sql语句，value是该语句的SqlParameter[]）</param>
        public static void ExecuteSqlTran(Hashtable SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();//打开数据库连接
                using (SqlTransaction trans = conn.BeginTransaction())//开始数据库事务
                {
                    SqlCommand cmd = new SqlCommand();//创建SqlCommand命令
                    try
                    {
                        //循环
                        foreach (DictionaryEntry myDE in SQLStringList)//循环哈希表（本例中 即，循环执行添加在哈希表中的sql语句
                        {
                            string cmdText = myDE.Key.ToString();//获取键值（本例中 即，sql语句）
                            SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;//获取键值（本例中 即，sql语句对应的参数）
                            PrepareCommand(cmd, conn, trans, cmdText, cmdParms); //调用PrepareCommand()函数，添加参数
                            int val = cmd.ExecuteNonQuery();//调用增删改函数ExcuteNoQuery()，执行哈希表中添加的sql语句
                            cmd.Parameters.Clear(); //清除参数
                        }
                        trans.Commit();//提交事务
                    }
                    catch //捕获异常
                    {
                        trans.Rollback(); //事务回滚
                        throw; //抛出异常
                    }
                }
            }
        }

        //添加参数
        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)//如果数据库连接为关闭状态
                conn.Open();//打开数据库连接
            cmd.Connection = conn;//设置命令连接
            cmd.CommandText = cmdText;//设置执行命令的sql语句
            if (trans != null)//如果事务不为空
                cmd.Transaction = trans;//设置执行命令的事务
            cmd.CommandType = CommandType.Text;//设置解释sql语句的类型为“文本”类型（也是就说该函数不适用于存储过程）
            if (cmdParms != null)//如果参数数组不为空
            {


                foreach (SqlParameter parameter in cmdParms) //循环传入的参数数组
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value; //获取参数的值
                    }
                    cmd.Parameters.Add(parameter);//添加参数
                }
            }
        }


    }
}
